#include <app.h>
#include <print.h>

APP_INFO appInfo[MAX_APP_NUM] = {0};
U16 appNum = 0;

E_RET AppRegister(APP_FUNC pFunc, U08* stackAddr, U16 stackSize, U08* name, E_APP_PRI priority)
{
    if(appNum >= MAX_APP_NUM)
        return E_ERR;

    appInfo[appNum].pfunc = pFunc;
    appInfo[appNum].stackAddr = stackAddr;
    appInfo[appNum].stackSize = stackSize;
    appInfo[appNum].name = name;
    appInfo[appNum].priority = priority;
    appNum++;

    return E_OK;
}

U08 taskA_stack[512];   // 任务私有栈
void TaskAFunc(void)    // 任务执行函数
{
    static U32 count = 0;
    while(1)
    {
        if(count++ % 10000 == 0)
        {
            static U32 j = 0;
            asm volatile("cli");
            SetCursorPos(0, 6);
            printk("TASK A: %d\n", j++); 
            asm volatile("sti");
        } 
    }
}

U08 taskB_stack[512];   // 任务私有栈
void TaskBFunc(void)    // 任务执行函数
{
    static U32 count = 0;
    while(1)
    {
        if(count++ % 10000 == 0)
        {
            static U32 j = 0;
            asm volatile("cli");
            SetCursorPos(0, 8);
            printk("TASK B: %d\n", j++); 
            asm volatile("sti");
        } 
    }
}

U08 taskC_stack[512];   // 任务私有栈
void TaskCFunc(void)    // 任务执行函数
{
    static U32 count = 0;
    while(1)
    {
        if(count++ % 10000 == 0)
        {
            static U32 j = 0;
            asm volatile("cli");
            SetCursorPos(0, 10);
            printk("TASK C: %d\n", j++); 
            asm volatile("sti");
        }   
    }
}

U08 taskD_stack[512];   // 任务私有栈
void TaskDFunc(void)    // 任务执行函数
{
    static U32 count = 0;
    while(1)
    {
        if(count++ % 10000 == 0)
        {
            static U32 j = 0;
            asm volatile("cli");
            SetCursorPos(0, 12);
            printk("TASK D: %d\n", j++); 
            asm volatile("sti");
        }  
    }
}

void AppInit(void)
{
    SetCursorPos(0, 3);                     // 设置光标位置: (0, 3)
    SetFontColor(E_FONT_WHITE);             // 设置打印字体颜色: 白色
    printk("AppInit\n");
    AppRegister(TaskAFunc, taskA_stack, 512, "TASK A", E_APP_PRI5);
    AppRegister(TaskBFunc, taskB_stack, 512, "TASK B", E_APP_PRI7);
    AppRegister(TaskCFunc, taskC_stack, 512, "TASK C", E_APP_PRI9);
    AppRegister(TaskDFunc, taskD_stack, 512, "TASK D", E_APP_PRI11);

    // 把应用数据放入共享内存 0xA800 处
    *((volatile U32*)0xA800) = (U32)appInfo;
    *((volatile U32*)0xA804) = appNum;
}
